package yannan.voiplock4ble.net.base;

import java.util.List;
import java.util.Map;

import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;
import yannan.voiplock4ble.bean.CheckFirVersion;
import yannan.voiplock4ble.bean.CommonResponse;
import yannan.voiplock4ble.bean.LockBean;
import yannan.voiplock4ble.bean.LockKeyBean;
import yannan.voiplock4ble.bean.LockOperNoteBean;
import yannan.voiplock4ble.bean.LockRecordBean;
import yannan.voiplock4ble.bean.UserBean;
import yannan.voiplock4ble.bean.VeinKeyBean;
import yannan.voiplock4ble.bean.VersionBean;

/**
 * Created by HOHD on 2016/9/26.
 * 联网接口
 */
public interface NetworkService {
    @POST("mobileLogin/submit.html")
    Call<String> getString(@Query("loginname") String loginname,
                           @Query("nloginpwd") String nloginpwd);

    @GET("/json/")
    Call<String> getJson(@Query("jsonFile") String jsonFile);


    /**
     * 一般的get请求
     *
     * @param url
     * @param stringMap
     * @return
     */
    @GET
    Call<String> commonGet(@Url String url, @QueryMap Map<String, String> stringMap);


    /**
     * 一般的get请求
     *
     * @param url
     * @return
     */
    @GET
    Call<ResponseBody> downLoad(@Url String url);

    /**
     * 获取验证码
     *
     * @param phoneNumber
     * @return
     */
    @POST("getVerificationCode")
    @FormUrlEncoded
    Call<CommonResponse> getVerificationCode(
            @Field("type") String type,
            @Field("phoneNumber") String phoneNumber);

    /**
     * login	用户登录
     * userAccount	账号
     * userPwd	密码
     * appType	1表示个人版。0表示户主版
     */
    @POST("login")
    @FormUrlEncoded
    Call<UserBean> login(@Field("userAccount") String userAccount,
                         @Field("userPwd") String userPwd,
                         @Field("appType") int appType);

    /**
     * registerUser	用户注册
     * userAccount	用户账号（手机号）
     * userPwd	密码
     * nickName	昵称（非必填）
     * headImageUrl 头像地址（非必填）
     * appType	1表示个人版。0表示户主版
     */
    @POST("registerUser")
    @FormUrlEncoded
    Call<UserBean> registerUser(@Field("userAccount") String userAccount,
                                @Field("userPwd") String userPwd,
                                @Field("appType") int appType,
                                @Field("headImageUrl") String headImageUrl,
                                @Field("nickName") String nickName);

    /**
     * uploadUserInfo	修改用户信息
     * userId	用户Id
     * nickName	昵称（非必填）
     * headImageUrl	头像地址（非必填）
     */
    @POST("uploadUserInfo")
    @FormUrlEncoded
    Call<CommonResponse> uploadUserInfo(@Field("userId") String userId,
                                        @Field("nickName") String nickName,
                                        @Field("headImageUrl") String headImageUrl);

    /**
     * uploadOperation	上传用户操作记录
     * userId	用户Id
     * time	时间
     * operationDetails	操作内容（见备注）
     * lockserialId	锁的序列号
     * type  操作类型1：指静脉2：密码0，除前两项以外的其他
     */
    @POST("uploadOperation")
    @FormUrlEncoded
    Call<CommonResponse> uploadOperation(@Field("userId") String userId,
                                         @Field("time") String time,
                                         @Field("operationDetails") String operationDetails,
                                         @Field("type") String type,
                                         @Field("lockserialId") String lockserialId);

    /**
     * getOperationNote	获取用户操作记录
     * pageIndex	页码
     * pagesize	每页条目
     * lockserialId	锁的序列号
     */
    @POST("getOperationNote")
    @FormUrlEncoded
    Call<List<LockOperNoteBean>> getOperationNote(@Field("pageIndex") String pageIndex,
                                                  @Field("pagesize") String pagesize,
                                                  @Field("lockserialId") String lockserialId);

    /**
     * uploadAddress	上传门锁地址
     * userId	用户Id
     * lockserialId	锁的序列号
     * address	详细地址
     * Latitude	经纬度
     */
    @POST("uploadAddress")
    @FormUrlEncoded
    Call<CommonResponse> uploadAddress(@Field("userId") String userId,
                                       @Field("lockserialId") String lockserialId,
                                       @Field("address") String address,
                                       @Field("Latitude") String Latitude);

    /**
     * changePwd	修改密码
     * newPwd	新密码
     * userId	用户Id
     */
    @POST("changePwd")
    @FormUrlEncoded
    Call<CommonResponse> changePwd(@Field("newPwd") String newPwd,
                                   @Field("userId") String userId);

    /**
     * uploadLockUserInfo	上传用户信息
     * lockserialId	锁的序列号
     * type	用户类型（0:指静脉；1:密码）
     * userIdentifier	指静脉对应手机号，密码对应密码编号
     * registerTime	注册时间
     * isBan	是否被禁止开门（1:启用；0:未启用）
     * userPermission	用户关于这一把锁的权限（1:管理员；0:普通用户）
     * operationType	操作类型（1:修改；0:删除；2：上传）
     */
    @POST("upLoadLockUserInfo")
    @FormUrlEncoded
    Call<CommonResponse> uploadLockUserInfo(@Field("lockUserInfo") String userInfoJson,
                                            @Field("userId") String userId);


    /**
     * editLockUserInfo	修改/删除锁用户信息
     * lockserialId	锁的序列号
     * type	用户类型（0:指静脉；1:密码）
     * userIdentifier	指静脉对应手机号，密码对应密码编号
     * operationType	操作类型（1:修改权限为普通用户；0:修改权限为管理员；2:删除用户）
     */
    @POST("editLockUserInfo")
    @FormUrlEncoded
    Call<CommonResponse> editLockUserInfo(@Field("lockserialId") String lockserialId,
                                          @Field("type") String type,
                                          @Field("userIdentifier") String userIdentifier,
                                          @Field("operationType") String operationType);


    /**
     * getPasswordList	获取密码列表
     * lockserialId	锁的序列号
     * userId	用户id
     */
    @POST("getPasswordList")
    @FormUrlEncoded
    Call<List<LockKeyBean>> getPasswordList(@Field("lockserialId") String lockserialId,
                                            @Field("userId") String userId);

    /**
     * getLockUserListBle	获取锁用户信息（返回指静脉列表）
     * lockserialId	锁的序列号
     * userId	用户id
     */
    @POST("getLockUserListBle")
    @FormUrlEncoded
    Call<List<LockKeyBean>> getLockUserListBle(@Field("lockserialId") String lockserialId,
                                               @Field("userId") String userId);

    /**
     * uploadLockState	上传锁状态
     * lockserialId	锁的序列号
     * veinKeyState	指静脉启用状态（1:启用；0:未启用）
     * pwdKeyState	密码启用状态（1:启用；0:未启用）
     * lockElec	电量
     */
    @POST("uploadLockState")
    @FormUrlEncoded
    Call<CommonResponse> uploadLockState(@Field("lockserialId") String lockserialId,
                                         @Field("veinKeyState") String veinKeyState,
                                         @Field("pwdKeyState") String pwdKeyState,
                                         @Field("mac") String mac,
                                         @Field("lockElec") String lockState);

    /**
     * lockserialId	锁的序列号
     * type	用户类型（0:指静脉；1:密码）
     * userIdentifier	指静脉对应手机号，密码对应密码编号
     * "userId
     * "	用户id
     * remark	备注名
     */
    @POST("editLockUserRemark")
    @FormUrlEncoded
    Call<CommonResponse> editLockUserRemark(@Field("lockserialId") String lockserialId,
                                            @Field("type") String type,
                                            @Field("userIdentifier") String userIdentifier,
                                            @Field("userId") String userId,
                                            @Field("remark") String remark);

    /**
     * updateLockName	修改锁的名称
     * lockserialId	锁的序列号
     * userId	用户id
     * lockName	别名
     */
    @POST("updateLockName")
    @FormUrlEncoded
    Call<CommonResponse> updateLockName(@Field("lockserialId") String lockserialId,
                                        @Field("userId") String userId,
                                        @Field("lockName") String lockName);


    /**
     * bindLockUrl	绑定门锁
     * lockserialId	锁的序列号
     * userId	用户id
     * userPermission	用户权限
     * lockName	别名（非必填）
     */
    @POST("bindLock")
    @FormUrlEncoded
    Call<CommonResponse> bindLockUrl(@Field("lockserialId") String lockserialId,
                                     @Field("userId") String userId,
                                     @Field("userPermission") String userPermission,
                                     @Field("lockName") String lockName,
                                     @Field("mac") String mac);

    /**锁的序列号
     * lockserialId
     * userId	用户id
     */
    @POST("unBindLock")
    @FormUrlEncoded
    Call<CommonResponse> unBindLock(@Field("lockserialId") String lockserialId,
                                    @Field("userId") String userId);

    /**
     * getLockList	获取锁列表
     * userId	用户id
     */
    @POST("getLockList")
    @FormUrlEncoded
    Call<List<LockBean>> getLockList(@Field("userId") String userId);

    /**
     * getNewestRecord	获取最新记录的时间
     * userId	用户id
     * lockserialId	锁的序列号
     * type	获取类型(见备注)1:开锁记录；2：指静脉钥匙；3：密码钥匙
     */
    @POST("getNewestRecord")
    @FormUrlEncoded
    Call<CommonResponse> getNewestRecord(@Field("userId") String userId,
                                         @Field("lockserialId") String lockserialId,
                                         @Field("type") String type);

    /**
     * uploadLockRecord	上传开锁记录
     * unlockingDate	开锁时间
     * lockserialId	锁的序列号
     * unlockinType	开锁类型 (0:指静脉;1:密码)
     * userIdentifier	指静脉对应手机号，密码对应密码编号
     */
    @POST("uploadLockRecord")
    @FormUrlEncoded
    Call<CommonResponse> uploadLockRecord(@Field("lockRecord") String lockRecord);

    /**
     * getUnlockingRecord	获取开锁记录
     * userId 用户id
     * beginDate	开始时间
     * endDate	结束时间
     * pageIndex	页码
     * pagesize	每页条目
     * lockserialId	锁的序列号
     */
    @POST("getUnlockingRecord")
    @FormUrlEncoded
    Call<List<LockRecordBean>> getUnlockingRecord(@Field("userId") String userId,
                                                  @Field("beginDate") String beginDate,
                                                  @Field("endDate") String endDate,
                                                  @Field("pageIndex") String pageIndex,
                                                  @Field("pageSize") String pagesize,
                                                  @Field("lockserialId") String lockserialId);

    /**
     * 上传头像
     *
     * @param userId
     * @param file
     * @return
     */
    @Multipart
    @POST("uploadFiles")
    Call<CommonResponse> upLoadFile(@Query("userId") String userId,
                                    @Part MultipartBody.Part file);

    /**
     * 重置密码
     *
     * @return
     */
    @POST("forgetPwd")
    @FormUrlEncoded
    Call<CommonResponse> forgetPwd(@Field("phoneNumber") String phoneNumber,
                                   @Field("newPwd") String newPwd);

    /**
     * 检查版本更新
     *
     * @return
     */
    @POST("checkAppVersion")
    Call<VersionBean> checkAppVersion();

    /**
     * 下载apk
     *
     * @return
     */
    @GET
    Call<ResponseBody> downLoadApk(@Url String url);

    /**
     * 检查门锁固件版本
     *
     * @param lockserialId
     * @return
     */
    @POST("checkFirmwareVersion")
    @FormUrlEncoded
    Call<CheckFirVersion> checkFirVersion(@Field("lockserialId") String lockserialId);
}